package main

import "fmt"

/*
   结构体值接受者实现接口

	 值接受者：如果结构体中的方法是值接受者，那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
   指针接受者：如果结构体中的方法是指针接受者，那么实例化后的结构体指针类型都可以赋值给变量接口，结构体值类型不能赋值给变量接口
*/

type Useber interface {
	start()
	stop()
}

type Phone struct {
	Name string
}

func (p Phone) start() { //值接受者
	fmt.Println(p.Name, "手机开始工作")
}

func (p Phone) stop() {
	fmt.Println(p.Name, "手机停止工作")
}

type Camera struct {
	Name string
}

func (c *Camera) start() { //指针接受者
	fmt.Print(c.Name, "相机开始工作")
}

func (c *Camera) stop() {
	fmt.Println(c.Name, "相机停止工作")
}

func main() {
	//结构体值接受者实例化后的结构体类型和结构体指针类型都可以赋值给接口变量
	p1 := Phone{
		Name: "华为",
	}

	var p2 Useber = p1 //表示让Phone实现Usb接口
	p2.start()

	p3 := &Phone{
		Name: "apple",
	}

	var p4 Useber = p3 //表示让Phone实现Usb接口
	p4.start()

	fmt.Println("--------------------")
	c1 := &Camera{
		Name: "尼康",
	}

	var c2 Useber = c1
	fmt.Println(c2)

}
